/**
 * 
 */
package br.com.ctm.advogadope.negocio.impl;

import java.util.HashSet;
import java.util.List;

import javax.annotation.security.PermitAll;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.PersistenceException;

import br.com.ctm.advogadope.dao.api.AdvogadoDao;
import br.com.ctm.advogadope.model.Advogado;
import br.com.ctm.advogadope.model.Papel;
import br.com.ctm.advogadope.model.Usuario;
import br.com.ctm.advogadope.negocio.api.AdvogadoNegocio;
import br.com.ctm.advogadope.negocio.api.PapelNegocio;
import br.com.ctm.advogadope.negocio.api.UsuarioNegocio;
import br.com.framework.negocio.exception.NegocioException;
import br.com.framework.negocio.impl.BaseNegocioImpl;

/**
 * @author Cleber
 *
 */
@Stateless
@PermitAll
public class AdvogadoNegocioImpl extends BaseNegocioImpl<Advogado, AdvogadoDao> implements
		AdvogadoNegocio {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Inject
	private UsuarioNegocio usuarioNegocio;
	
	@Inject
	private PapelNegocio papelNegocio;

	/**
	 * 
	 */
	public AdvogadoNegocioImpl() {
	}
	
	@Inject
	protected void setDao(AdvogadoDao dao) {
		super.setDao(dao);
	}


	@Override
	public void insert(Advogado entidade) throws PersistenceException,
			NegocioException {
		if (entidade.getUsuario() == null) {
			throw new NegocioException("advogado.erro.negocio.usuarioNaoInformado");
		}
		Papel papelAdv = new Papel();
		papelAdv.setNome(Papel.ADVOGADO);
		List<Papel> list = papelNegocio.findByExample(papelAdv);
		if (!list.isEmpty()) {
			papelAdv = list.get(0);
		}
		Usuario usuario = entidade.getUsuario();
		if (usuario.getPapeis() == null) {
			usuario.setPapeis(new HashSet<Papel>());
		}
		usuario.getPapeis().add(papelAdv);
		usuarioNegocio.insert(entidade.getUsuario());
		super.insert(entidade);
	}

	@Override
	public List<Advogado> findByProcesso(String npu, int firstResult,
			int maxResults, boolean onlyActive) throws PersistenceException {
		return getDao().findByProcesso(npu, firstResult, maxResults, onlyActive);
	}
	
}
